#ifndef MODBUSSERVICE_H
#define MODBUSSERVICE_H
#include <QThread>
#include <QTimer>
#include <QDebug>
#include <QtSql/QSql>
#include <QtSql/QSqlQueryModel>
#include <QtSql/QSqlDatabase>
#include <QtSql/QSqlQuery>

#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <signal.h>

#include <libmodbus/modbus.h>

#if defined(_WIN32)
#include <ws2tcpip.h>
#else
#include <sys/select.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#endif

#define RTU 1
#define UT_BITS_NB 16
#define UT_INPUT_BITS_NB 16
#define UT_REGISTERS_NB 1024
#define UT_INPUT_REGISTERS_NB 16

#define G_OPEN 1 //开命令
#define G_CLOSE 2 //关命令
#define G_PRESET 3 //预置命令


class ModBusService: public QThread
{
    Q_OBJECT
signals:
    void progress();//用来发射更新数据信号
    void message(const QString& info);
public:
    ModBusService(QObject* par);
    ~ModBusService();
    void DoSomething();//更新服务器的点位数据，更新完毕后，发射信号给主线程
    void run();
public:

    modbus_t *ctx = NULL;//modbus上下文
    modbus_mapping_t *mb_mapping = NULL;//modbus数据指针
    uint8_t *query;
    int rc;
    int use_backend;//使用modbus方式
    uint8_t UT_BITS_TAB[UT_BITS_NB];//16点输出线圈
    uint8_t UT_INPUT_BITS_TAB[UT_INPUT_BITS_NB];//16点输入
    uint16_t UT_REGISTERS_TAB[UT_REGISTERS_NB];//1K字节的可读可写寄存器
    uint16_t UT_INPUT_REGISTERS_TAB[UT_INPUT_REGISTERS_NB];//16个模拟量通道，只读寄存器

public slots:
   void stopImmediately();
   void startImmediately();
   int Service_Init();
   void Iinit_Data();
private:
   bool m_isCanRun;
};


#endif // MODBUSSERVICE_H
